#include "cmdprocessing.h"

/*
 *description:
 *       判断是否为支持的命令类型，若是返回true,否则返回false
 *usage:
 *       char *cmd = "ls";
 *       CMD_TYPE type;
 *       bool isValid = isValidCmd(cmd, &type);
 *       // isValid == true;
 *       // type == LS;
 *paras:
 *       cmd         命令名称, 如：cd, ls, pwd
 *       type        枚举命令类型值指针，用于接收命令类型枚举值
 *returns:
 *       true        支持的有效命令
 *       false       不支持的无效命令
 */
static bool isValidCmd(const char *cmd, CMD_TYPE *type);

CMD_TYPE getCommandType(const char *command, char *cmdType)
{
    char *delimiters = " \n\t";
    int size = 0;
    char **tokens = splitString(command, delimiters, &size);
    for(int i = 0;i < size;i ++)
    {
    }
    CMD_TYPE type;
    if (tokens == NULL || !isValidCmd(tokens[0], &type))
    {
        // 分割命令失败或是不支持的命令类型，返回INVALID_CMD
        strcpy(cmdType, "uknow type");
    }
    else
    {
        // TODO: 如何释放splintString中动态分配的内存，并且不造成cmdType访问野指针？
        // 已经解决通过使用strcpy或memcopy函数将字符串复制到传入传出参数中
        strcpy(cmdType, tokens[0]);
    }

    freeTokens(&tokens, size); // 释放动态分配内存
    return type;
}

static bool isValidCmd(const char *cmd, CMD_TYPE *type)
{
    // TODO: 从配置文件中读取支持的命令列表
    char *supportCmds[] = {
        "cd",
        "ls",
        "pwd",
        "puts",
        "gets",
        "remove",
        "rm",
        "mkdir",
    };

    size_t len = COUNT_OF(supportCmds);

    // TODO: 当前枚举值定义为硬编码需要修改为按照从配置文件中读取顺序定义
    for (size_t i = 0; i < len; i++)
    {
        if (strcmp(cmd, supportCmds[i]) == 0)
        {
            *type = (CMD_TYPE)i;
            return true;
        }
    }

    *type = INVALID_CMD;
    return false;
}